#include "Vector3D.h"

/*******************************************************************************
 
  Purpose - 

 *******************************************************************************/
Vector3D::Vector3D(void) :
    Tuple3D()
{
}

/*******************************************************************************
 
  Purpose - 

 *******************************************************************************/
Vector3D::Vector3D(Tuple3D t1) :
    Tuple3D(t1)
{
}

/*******************************************************************************
 
  Purpose - 

 *******************************************************************************/
Vector3D::Vector3D(Point3D p) :
    Tuple3D(p.x, p.y, p.z)
{
}

/*******************************************************************************
 
  Purpose - 

 *******************************************************************************/
Vector3D::Vector3D(double x, double y, double z) :
    Tuple3D(x, y, z)
{
}

/*******************************************************************************
 
  Purpose - 

 *******************************************************************************/
void Vector3D::cross(Vector3D v1, Vector3D v2)
{
    x = (v1.y * v2.z) - (v1.z * v2.y);
    y = (v1.z * v2.x) - (v1.x * v2.z);
    z = (v1.x * v2.y) - (v1.y * v2.x);
}

/*******************************************************************************
 
  Purpose - 

 *******************************************************************************/
double Vector3D::dot(const Vector3D v1) const
{
    return (x * v1.x) + (y * v1.y) + (z * v1.z);
}

/*******************************************************************************
 
  Purpose - 

 *******************************************************************************/
double Vector3D::length(void)
{
    return sqrt(x * x + y * y + z * z);
}

/*******************************************************************************
 
  Purpose - 

 *******************************************************************************/
void Vector3D::normalise(void)
{
    double l = length();

    x /= l;
    y /= l;
    z /= l;
}

/*******************************************************************************
 
  Purpose - 

 *******************************************************************************/
double Vector3D::angle(Vector3D v1)
{
    double vDot = dot(v1) / (length() * v1.length());

    if (vDot < -1.0)
        vDot = -1.0;
    if (vDot > 1.0)
        vDot = 1.0;

    return acos(vDot);
}
